package org.finesys.samples.file.nio;
/**
 * NIO是Java1.4后引入的Java.nio包，提供了channel、selector、buffer等新的抽象，可以构建多路复用的、同步非阻塞式的IO程序，同时提供了更接近
 * 操作系统底层高性能的数据操作方式。NIO通过使用单线程轮询多个连接的方式来实现高校的处理方式，可以支持较大数量的并发连接，但编程模型比较复杂。
 *
 * NIO是为了解决BIO的缺陷提出的通信模型。
 *
 *
 * 重要特点：socket主要的读、写、注册和接收函数，在等待就绪阶段都是非阻塞的，真正的IO操作是同步阻塞的（消耗CPU但性能非常高）
 *
 *Channel：FileChannel 文件通道、 DatagramChannel（UDP协议）、SocketChannel（TCP协议） ServerSocketChannel（监听Tcp链接请求）
 *
 * Channel 通道，就是数据传输的管道，类似于流，但与流不同；
 * 区别：
 *  既可以从channel读取数据，又可以写数据，但流的读写通常都是单向的
 *  通道可以异步读写
 *  通道中的数据总是先读取到buffer缓冲区，或者总是需要一个buffer写入，不能直接访问数据
 *
 *
 *channel为什么支持异步读写？
 *  .非阻塞特性：channel设计上采用了非阻塞的特性，它不会像传统的流一样在读写操作上阻塞线程，而是立即返回结果，告诉调用者当前的状态。这使得
 *      程序可以在等待数据准备的过程中同时进行其他操作，实现了非阻塞IO。
 *  .事件通知机制：channel通常搭配选择器selector来使用，选择器能够检查多个channel的就绪状态，如是否可以读写等，并通过事件通知（例如轮询或回调）
 *      及时通知程序哪些channel处于就绪状态，从而可以进行读写操作。
 *  .操作系统底层支持：channel的读写依赖于操作系统底层的异步IO支持。JAVA NIO中的channel实际上是对操作系统底层异步IO的封装和抽象，利用了操作系统
 *      提供的异步IO机制来实现其自身的异步读写功能。
 *
 * 什么是buffer？
 *  Buffer是一个对象，里面是要写入和读取的数据，在JAVA.nio中，所有的数据都是用缓冲区来处理的。
 *  缓冲区实际上一个数组，通常是一个字节数组ByteBuffer,还有其他类型：LongBuffer\ShortBuffer\DoubleBuffer\FloatBuffer\CharBuffer\IntBuffer等
 *
 *  什么是Selector?
 *    Selector被称为选择器，Selector会不断轮询注册在其上的Channel，如果某个Channel上发生读写，这个Channel就被判断为处于就绪状态，会被Selector
 *    轮询出来，然后通过SelectionKey可以获取到就绪Channel的集合，进行后续的IO操作。
 *    一个多路复用器Selector可以同时轮询多个Channel，JDK使用了epoll()代替了传统的select实现，所以并没有最大句柄的限制，这意味着只需要一个线程
 *    负责Selector的轮询，就可以接入成千上万的客户端。
 *
 *    select实现：
 *    select方法是一种用于实现IO多路复用的系统调用，在UNIX、Linux上被广泛应用。其主要作用是监视多个文件描述符，当其中任何一个文件描述符就绪（可读、可写、异常）时，
 *    通知程序进行相应的IO操作。
 *    1、功能：select方法允许程序同时监视多个文件描述符的IO状态，包括读写异常状态，从而实现IO多路复用，提高程序的效率。
 *    2、使用：程序需要将监视文件描述符传递给select方法，并设置超时时间（NULL一直等待）。select方法会阻塞程序，直到其中一个文件描述符就绪或超时为止。
 *    3、返回值：select方法返回就绪的文件描述符的数量，如果超时则返回0，如果出错返回-1.程序可以通过检查文件描述符集合的状态来确定哪些文件处于就绪状态。
 *    4、限制：select方法在监视文件描述符时有最大句柄限制，一般不超过1024哥文件描述符。这限制了select方法在处理大规模并发时的效率。
 *    5、缺点：select方法由于使用位图来表示文件描述符的集合，需要线性遍历所有文件描述符，导致效率降低，特别是在大量文件描述符情况下。
 *
 *   位图：BitMap
 *   一种数据结构，用于表示若干个比特位的集合。在计算机中，每一位（bit）只能为0、1，因此位图实际上是一个由0、1组成的序列，用来表示某些状态和信息。
 *
 *
 *
 * 优点：
 * 1、高并发性：使用选择器selector和通道channel的NIO模型可以在单线程上处理多个连接，提供更高的性能
 * 2、节省资源：相对于BIO，NIO需要更少的线程来处理相同数量的连接，节省了系统资源
 * 3、灵活性：NIO提供了多种类型的channel和Buffer，可以根据选择合适的类型。NIO允许开发人员自定义协议、编解码器等组件，从而提高系统的灵活性可扩展性
 * 4、高性能：NIO采用了基于通道和缓冲区的方式来读取数据，比传统的流方式更高效。可以减少数据拷贝次数，提高数据处理效率。
 * 5、内存管理：NIO允许用户手动管理缓冲区的内存分配和回收，避免了传统模型中的内存泄露问题。
 *缺点：
 * 1、编程复杂：相对BIO，NIO的编程方式更加复杂，需要理解选择权和缓冲区概念，也需要考虑多线程处理和同步问题。
 * 2、可靠性较低：NIO模型中，一个连接的读写是非阻塞的，无法保证IO的操作结果是可靠的，可能会出现部分读写或者错误的数据。
 *
 *
 * 适用于连接数较多、并发性要求较高的网络应用，比如高性能的服务器应用、网关应用等。
 * */